package org.jflame.context.filemanager;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.SystemUtils;

/**
 * 非本地的文件系统抽象父类
 * 
 * @author charles.zhang
 * @param <T> 子类所需配置文件实际类型
 */
public abstract class RemoteFileManager<T extends FileManagerCfg> extends BaseFileManager<T> {

    /**
     * 缓存到本地的临时文件过期时间(单位秒),0表示不缓存
     */
    private int tmpFileExpires = 0;

    public RemoteFileManager(T cfg) {
        super(cfg);
    }

    /**
     * 文件id映射到本地临时缓存目录路径
     * 
     * @param fileId
     * @return
     */
    protected Path mappingTmpFile(String fileId) {
        String fileManager = getClass().getSimpleName()
                .toLowerCase();
        File tmpDir = SystemUtils.getJavaIoTmpDir();
        Path tmpFilePath = tmpDir.toPath()
                .resolve(Paths.get(fileManager, fileId));

        if (!Files.exists(tmpFilePath.getParent())) {
            try {
                Files.createDirectories(tmpFilePath.getParent());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return tmpFilePath;
    }

    /**
     * 获取本地临时缓存目录文件
     * 
     * @param p
     * @return
     */
    protected Optional<File> getTmpCacheFile(Path p) {
        if (p != null) {
            File f = p.toFile();
            if (f.exists()) {
                if (tmpFileExpires > 0 && TimeUnit.MILLISECONDS
                        .toSeconds(System.currentTimeMillis() - f.lastModified()) > tmpFileExpires) {
                    return Optional.of(f);
                }
            } else {
                f.delete();
            }
        }
        return Optional.empty();
    }

    public int getTmpFileExpires() {
        return tmpFileExpires;
    }

    public void setTmpFileExpires(int expiresInSecond) {
        this.tmpFileExpires = expiresInSecond;
    }
}
